package c03数据类型和运算符;

public class 比较运算符与equals方法 {
	public static void main(String[] args) {
		Boolean B = new Boolean(true);
		boolean b = true;
		Integer I1 = 256;
		int i = 256;
		Integer I2 = 256;
		Long L = new Long(256);
		Object o1 = new Object();
		Object o2 = new Object();
		Object o3 = o1;
		String s = "xxx";

		System.err.println("@@含有>和<的运算符只能比较数值型（包括基本类型和包装类型）！可以比较不同数值型~");
		System.err.println(5 > 5.0);//false
		System.err.println(5 >= 5.0);//true
		System.err.println(97 > 'a');//false。char可以转化为int！
		//如果比较大小中含有包装类型，推荐用包装类型的compare方法！
		System.err.println(I1 > 128);//true
		System.err.println(I1 >= I2);//true
		System.err.println(I1 >= L);//true
//		System.err.println(false>true);//错误！

		System.err.println("==比较基本数值型：可以比较不同数值型~");
		System.err.println(5 == 5.0);//true
		System.err.println(97 == 'a');//true

		System.err.println("==比较基本数值型与包装数值型：可以比较不同数值型~");
		System.err.println(I1 == i);//true！！
		System.err.println(I1 == 123);//false
		System.err.println(L == i);//可以比较！返回true！

		System.err.println("@@==比较包装数值型与包装数值型：可能会出现问题~");
		System.err.println(I2 == I1);//false！与Integer内部实现有关！
		I1 = 2;
		I2 = 2;
		System.err.println(I2 == I1);//true！与Integer内部实现有关！
		//如果比较相等，可以用equals方法！
		System.err.println(I2.equals(I1));//这才是true！所以比较包装类与包装类的相等关系时最好用equals方法！
		//包装类型的compare方法既可以比较大小又可以比较相等！
		System.err.println(Integer.compare(I1, I2));//0
		System.err.println(Long.compare(I1, L));//-1

		System.err.println("==比较布尔类型");
		System.err.println(true == false);//false。布尔型只能和布尔型比较！
		System.err.println(b == B);//可以比较！返回true！

		System.err.println("==比较引用型");
		System.err.println(o1 == o2);//false
		System.err.println(o1 == o3);//true
		//@@比较不同引用型。如果有继承关系，不会出错（注意运行时会不会变成相同类型并引用相同对象！）
		//否则，编译出错！
		System.err.println(o1 == s);//false
		o1 = s;
		System.err.println(o1 == s);//true！Object是String父类，运行时o1类型变成String，此时o1与s引用同一个对象！
//		System.err.println("xxx"==B);//编译出错！String与B没有继承关系，==不能比较！

		System.err.println("除此之外，不能比较基本类型和其他引用类型、不能比较数值型和布尔型！");
//		System.err.println(i==o1);//编译出错！
//		System.err.println(i>o1);//编译出错！
//		System.err.println(5==true);//编译出错！
//		System.err.println(5>true);//编译出错！
//		System.err.println(o1>true);//编译出错！

		System.err.println("!=与==使用限制一样，结果相反而已");
		System.err.println(5 != 4.0);//true

		System.err.println("equals使用");
		//@@equals只能被引用类型对象调用，因为基本类型无法调用任何方法！但是可以调用来与基本类型比较：
		System.err.println(B.equals(b));
//		System.err.println(b.equals(B));//编译错误！
		//下面的结果与上面用==比较的结果相同！这是因为Object内部的equals方法其实调用的就是==！
		System.err.println(o1.equals(o2));//false！
		System.err.println(o1.equals(o3));//true！
	}
}
